﻿using pdfer.FileObjects;
using pdfer.Syntax;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace pdfer.PdfObjecs
{
    internal class PageDictionary : PdfFileObject
    {
        // /Type 必须是/Page
        // /Contents indirect reference to stream or array of such references    一个或多个部分中页面的图形内容。如果缺少此条目，则页面为空
        // /Parent* 间接引用字典  页面树中此节点的父节点
        // /Resources dictionary  页面的资源（字体，图像等）。如果完全省略此条目，则资源将从页面树中的父节点继承。如果确实没有资源，请包含此条目但使用空字典
        // /Rotate 整数  页面的查看旋转，以度为单位，从北向顺时针。值必须是90的倍数。默认值：0。这适用于查看和打印。如果缺少此条目，则其值将从页面树中的父节点继承
        // /MediaBox* rectangle   页面的媒体框（媒体大小，即纸张）。对于大多数用途，页面大小。如果缺少此条目，则它将从页面树中的父节点继承
        // /CropBox rectangle   页面的裁剪框。这定义了在显示或打印页面时默认可见的页面区域。如果不存在，则将其值定义为与媒体框相同
        public PageDictionary(PdfFileObject pdfFileObject)
            : base(pdfFileObject)
        {
            if (pdfFileObject.TryGetValue(PdfName.Key_Type, out object? val))
            {
                Type = PdfParserUtils.ParseString(val);
                if (Type != PdfTypeConst.Type_Page)
                {
                    throw new Exception("类型必须是 /Page");
                }
            }
        }
        public String Type { get; set; }

        public Int32 PageIndex { get; set; }

        private List<String> _contents;
        private String _parent;
        private Dictionary<String, Object>? _resources;
        private Int32 _rotate = -1;
        private List<Int32> _mediaBox;
        private List<Int32> _cropBox;


        /// <summary>
        /// 一个或多个部分中页面的图形内容。如果缺少此条目，则页面为空
        /// </summary>
        public List<String> Contents
        {
            get
            {
                if (_contents == null && TryGetValue(PdfName.Key_Contents, out var obj))
                {
                    if(obj is IList)
                    {
                        _contents = ParseList(obj, PdfParserUtils.Trans2String);
                    }
                    else
                    {
                        _contents = [PdfParserUtils.Trans2String(obj)];
                    }
                }
                return _contents;
            }
        }
        public String Parent
        {
            get
            {
                if (_parent == null && TryGetValue(PdfName.Key_Parent, out var obj))
                {
                    _parent = PdfParserUtils.ParseString(obj);
                }
                return _parent;
            }
        }

        /// <summary>
        /// 共享的资源集合 字体 图像等
        /// []空字典表示没有共享资源也不会从父级继承
        /// null 则会找到父级中的共享资源
        /// 提供一些按名称访问的对象或内容给内容流
        /// ExtGState   将资源名称映射到图形状态参数字典的字典
        /// ColorSpace  一个字典，用于将每个资源名称映射到与设备相关的色彩空间的名称或描述色彩空间的数组
        /// Pattern     将资源名称映射到模式对象的字典
        /// Shading     将资源名称映射到着色词典的字典
        /// XObject     将资源名称映射到外部对象的字典
        /// Font        将资源名称映射到字体字典的字典
        /// ProcSet     预定义过程集名称的数组
        /// Properties  将资源名称映射到已标记内容的属性列表词典的字典
        /// </summary>
        public Dictionary<String, Object>? Resources
        {
            get
            {
                if (_resources == null && TryGetValue(PdfName.Key_Resources, out var obj))
                {
                    _resources = ParseDictionary(obj);
                }
                if(_resources == null)
                {
                    // null 所以需要从父级继承
                }

                return _resources;
            }
        }
        /// <summary>
        /// 可以继承
        /// </summary>
        public Int32 Rotate
        {
            get
            {
                if (_rotate == -1 && TryGetValue(PdfName.Key_Rotate, out var obj))
                {
                    _rotate = ParseInt32(obj, -1);
                }
                if (_rotate == -1)
                {
                    // -1 所以需要从父级继承
                }
                return _rotate;
            }
        }
        /// <summary>
        /// 可以继承
        /// </summary>
        public List<Int32> MediaBox
        {
            get
            {
                if (_mediaBox == null && TryGetValue(PdfName.Key_MediaBox, out var obj))
                {
                    _mediaBox = ParseList(obj, PdfParserUtils.Trans2Int32);
                }
                if (_mediaBox == null)
                {
                    // null 所以需要从父级继承
                }
                return _mediaBox;
            }
        }
        /// <summary>
        /// 可以继承
        /// </summary>
        public List<Int32> CropBox
        {
            get
            {
                if (_cropBox == null && TryGetValue(PdfName.Key_CropBox, out var obj))
                {
                    _cropBox = ParseList(obj, PdfParserUtils.Trans2Int32);
                }
                if (_cropBox == null)
                {
                    // null 所以需要从父级继承
                }
                return _cropBox;
            }
        }
    }
}
